<%@ Page Title="About Us" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="About.aspx.cs" Inherits="INHollandair.About" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <div class="container pull-down">
        <div class="row">
            <div class="span8 offset2">
                <h2>Over INHollandair - De beveiliging</h2>
                <div class="well roundedBorder form-horizontal">
                    Welkom op de INHollandair Loyalty portal! Op deze pagina zullen de beveiligingsaspecten rondom de toetsing van de applicatie toegelicht worden.<br />
                    <br />
                    <div style="border-top: 1px solid #DDD; padding: 20px 0;">
                        <h2>Inhoudsopgave</h2>
                        <br />
                        <a href="#1"><span class="label label-info">1.</span> Minimale eisen INHollandair Loyalty Portal</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-1"><span class="label label-success">1.1</span> Accountmanagement</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-1-1"><span class="label label-warning">1.1.1</span> Nieuwe account aanmaken</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-1-2"><span class="label label-warning">1.1.2</span> Inloggen</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-1-3"><span class="label label-warning">1.1.3</span> Account bekijken</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-1-4"><span class="label label-warning">1.1.4</span> Account bewerken</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-1-5"><span class="label label-warning">1.1.5</span> Puntentotaal bekijken</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-1-6"><span class="label label-warning">1.1.6</span> Vergeten gebruikersnaam/wachtwoord opvragen</a><br />
                        <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-2"><span class="label label-success">1.2</span> Bestellingen</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-2-1"><span class="label label-warning">1.2.1</span> Een vlucht kiezen op een bepaalde datum</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-2-2"><span class="label label-warning">1.2.2</span> Een vlucht betalen met INHollandair Miles</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-2-3"><span class="label label-warning">1.2.3</span> Een vlucht annuleren</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-2-4"><span class="label label-warning">1.2.4</span> Gemaakte bestellingen terugzien</a><br />
                        <br />
                        <a href="#2"><span class="label label-info">2.</span> Beoordelingspunten</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;<a href="#2-1"><span class="label label-success">2.1</span> Inputvalidatie</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;<a href="#2-2"><span class="label label-success">2.2</span> Toegangscontrole</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;<a href="#2-3"><span class="label label-success">2.3</span> Wachtwoordsterkte / brute-force</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;<a href="#2-4"><span class="label label-success">2.4</span> Foutafhandeling en -logging</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;<a href="#2-5"><span class="label label-success">2.5</span> Applicatiedata opslag</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;<a href="#2-6"><span class="label label-success">2.6</span> Audit trail en logging</a><br />
                        <br />
                        <a href="#3"><span class="label label-info">3.</span> Extra security maatregelen</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;<a href="#3-1"><span class="label label-success">3.1</span> SSL/HTTPS verbinding voor elke pagina</a><br />
                        &nbsp;&nbsp;&nbsp;&nbsp;<a href="#3-2"><span class="label label-success">3.2</span> ASP ViewState encryptie</a><br />
                    </div>
                    <div style="border-top: 1px solid #DDD; padding: 20px 0;">
                        <h3 id="1"><span class="label label-info">1</span> Minimale eisen INHollandair Loyalty Portal</h3>
                        <div style="padding: 3px 30px 20px 30px;">
                            Voor de toetsing van dit tentamenonderdeel is een lijst van minimale eisen opgesteld. Deze zullen puntsgewijs behandeld worden.
                        </div>

                        <h4 id="1-1"><span class="label label-success">1.1</span> <strong><em>Accountmanagement</em></strong></h4>
                        <div style="padding: 3px 30px 20px 30px;">
                            Bij vrijwel alle webwinkels is het mogelijk om een account aan te maken. Behalve een account aanmaken, dient de gebruiker zijn
                            gegevens ook aan te kunnen passen. Stel dat de gebruiker zijn wachtwoord is vergeten, dan dient deze ook opnieuw aangevraagd
                            te kunnen worden, zodat de gebruiker weer gebruik kan maken van de door INHollandair aangeboden diensten.
                        </div>

                        <h5 id="1-1-1"><span class="label label-warning">1.1.1</span> <em>Nieuwe account aanmaken</em></h5>
                        <div style="padding: 3px 30px 20px 30px;">
                            Op de pagina <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Account/Register.aspx" Target="_blank">/Account/Register.aspx</asp:HyperLink>
                            is het mogelijk om een nieuwe account aan te maken. Zodra een bezoeker een gebruikersaccount aanmaakt, zal er gekeken worden of...
                            <ul>
                                <li>... de user input valide is (zie <a href="#2-1">2.1 Inputvalidatie</a>);</li>
                                <li>... in de database de gebruikersnaam nog niet bestaat;</li>
                                <li>... in de database het e-mailadres nog niet voorkomt.</li>
                            </ul>
                            <br />
                            Zodra een gebruiker ingelogd is (zie de volgende paragraaf), is het op dat moment niet meer mogelijk om de Registratie pagina te bezoeken.
                            Dit gebeurd via het volgende stukje code:
                            <style type="text/css">
                            .sc5 { font-weight: bold; color: #0000FF; }
                            .sc6 { color: #808080; }
                            .sc10 { font-weight: bold; color: #000080; }
                            </style>
                            <pre><span class="sc5">if </span><span class="sc10">(</span>HttpContext<span class="sc10">.</span>Current<span class="sc10">.</span>User<span class="sc10">.</span>Identity<span class="sc10">.</span>IsAuthenticated<span class="sc10">)</span>
<span class="sc10">{</span>
    Response<span class="sc10">.</span>Redirect<span class="sc10">(</span><span class="sc6">"~/Default.aspx"</span><span class="sc10">);</span>
<span class="sc10">}</span></pre>
                        </div>

                        <h5 id="1-1-2"><span class="label label-warning">1.1.2</span> <em>Inloggen</em></h5>
                        <div style="padding: 3px 30px 20px 30px;">
                            Op de pagina <asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl="~/Account/Login.aspx" Target="_blank">/Account/Login.aspx</asp:HyperLink>
                            kan een geregistreerde gebruiker inloggen. Dit kan tevens gedaan worden bovenaan elke pagina, waar bovenaan aan de rechter kant ook een login
                            formuliertje te vinden is.<br />
                            <br />
                            Om aanvallen op/via dit formulier tegen te gaan, hebben we enkele maatregelen getroffen om het aanvallers lastiger te maken. Deze maatregelen
                            zijn terug te vinden in paragraaf <a href="#2-3">2.3 Wachtwoordsterkte / brute-force</a>.
                        </div>

                        <h5 id="1-1-3"><span class="label label-warning">1.1.3</span> <em>Account bekijken</em></h5>
                        <div style="padding: 3px 30px 20px 30px;">
                            Op de pagina <asp:HyperLink ID="HyperLink3" runat="server" NavigateUrl="~/Account/Settings.aspx" Target="_blank">/Account/Settings.aspx</asp:HyperLink>
                            kunnen geregistreerde gebruikers hun persoonlijke informatie bekijken. Ook kunnen ze op deze pagina zien hoeveel INHollandair Miles ze bezitten en welke
                            vluchten ze tot dusver geboekt hebben.
                        </div>

                        <h5 id="1-1-4"><span class="label label-warning">1.1.4</span> <em>Account bewerken</em></h5>
                        <div style="padding: 3px 30px 20px 30px;">
                            Op de pagina <asp:HyperLink ID="HyperLink4" runat="server" NavigateUrl="~/Account/ChangeUser.aspx" Target="_blank">/Account/ChangeUser.aspx</asp:HyperLink>
                            kunnen geregistreerde gebruikers al hun informatie aanpassen, behalve de username waarmee de bezoeker zich geregistreerd heeft. 
                        </div>

                        <h5 id="1-1-5"><span class="label label-warning">1.1.5</span> <em>Puntentotaal bekijken</em></h5>
                        <div style="padding: 3px 30px 20px 30px;">
                            Het INHollandair Miles saldo is te bekijken op de pagina
                            <asp:HyperLink ID="HyperLink5" runat="server" NavigateUrl="~/Account/Settings.aspx" Target="_blank">/Account/Settings.aspx</asp:HyperLink>, zoals reeds
                            genoemd in paragraaf <a href="#1-1-3">1.1.3 Account bekijken</a>.
                        </div>

                        <h5 id="1-1-6"><span class="label label-warning">1.1.6</span> <em>Vergeten gebruikersnaam/wachtwoord opvragen</em></h5>
                        <div style="padding: 3px 30px 20px 30px;">
                            Op de pagina <asp:HyperLink ID="HyperLink6" runat="server" NavigateUrl="~/Account/ForgotPassword.aspx" Target="_blank">/Account/ForgotPassword.aspx</asp:HyperLink>
                            kunnen gebruikers via hun e-mailadres hun gebruikersnaam ophalen en hun wachtwoord resetten.
                        </div>

                        <h4 id="1-2"><span class="label label-success">1.2</span> <strong><em>Bestellingen</em></strong></h4>
                        <div style="padding: 3px 30px 20px 30px;">
                            Wat is een webwinkel met gebruikers, maar zonder producten?
                        </div>

                        <h5 id="1-2-1"><span class="label label-warning">1.2.1</span> <em>Een vlucht kiezen op een bepaalde datum</em></h5>
                        <div style="padding: 3px 30px 20px 30px;">
                            Op de pagina <asp:HyperLink ID="HyperLink7" runat="server" NavigateUrl="~/Shop/Products.aspx" Target="_blank">/Shop/Products.aspx</asp:HyperLink>
                            kan een gebruiker, zowel ingelogde als niet ingelogde gebruikers, een vlucht selecteren per datum. Een gebruiker kan dan via de knop
                            <input type="button" class="btn btn-mini" value="Geef product weer" /> naast elke vlucht
                            meer details opvragen over de desbetreffende vlucht.
                        </div>

                        <h5 id="1-2-2"><span class="label label-warning">1.2.2</span> <em>Een vlucht betalen met INHollandair Miles</em></h5>
                        <div style="padding: 3px 30px 20px 30px;">
                            Nadat er op de knop <input type="button" class="btn btn-mini" value="Geef product weer" /> van een vlucht op de
                            pagina <asp:HyperLink ID="HyperLink8" runat="server" NavigateUrl="~/Shop/Products.aspx" Target="_blank">/Shop/Products.aspx</asp:HyperLink>
                            geklikt is, zal meer informatie over de vlucht getoond worden aan de gebruiker. Ook heeft de gebruiker de mogelijkheid de vlucht te boeken
                            via de knop <input type="button" class="btn btn-inverse btn-mini" value="Bestel product" />.
                        </div>

                        <h5 id="1-2-3"><span class="label label-warning">1.2.3</span> <em>Een vlucht annuleren</em></h5>
                        <div style="padding: 3px 30px 20px 30px;">
                            Op de pagina <asp:HyperLink ID="HyperLink9" runat="server" NavigateUrl="~/Account/Settings.aspx" Target="_blank">/Account/Settings.aspx</asp:HyperLink>
                            kan een ingelogde gebruiker zijn vluchten bekijken en annuleren. Dit kan via de knop
                            <input type="button" class="btn btn-danger btn-mini" value="Annuleer bestelling" /> naast elke bestelling.
                        </div>

                        <h5 id="1-2-4"><span class="label label-warning">1.2.4</span> <em>Gemaakte bestellingen terugzien</em></h5>
                        <div style="padding: 3px 30px 20px 30px;">
                            Zoals in de vorige paragraaf <a href="#1-1-3">1.2.3 Een vlucht annuleren</a> al gezegd werd, kan een ingelogde gebruiker zijn gemaakte
                            bestellingen terugzien op de pagina
                            <asp:HyperLink ID="HyperLink10" runat="server" NavigateUrl="~/Account/Settings.aspx" Target="_blank">/Account/Settings.aspx</asp:HyperLink>.
                        </div>

                        <h3 id="2"><span class="label label-info">2.</span> <strong>Beoordelingspunten</strong></h3>
                        <div style="padding: 3px 30px 20px 30px;">
                            Op tentamen niveau zal deze applicatie getoetst worden op een aantal criteria. Deze beoordelingspunten worden hieronder puntsgewijs behandeld.
                        </div>

                        <h4 id="2-1"><span class="label label-success">2.1</span> <strong><em>Inputvalidatie</em></strong></h4>
                        <div style="padding: 3px 30px 20px 30px;">
                            Tijdens de registratie van een nieuwe gebruiker worden er enkele eisen gesteld aan de sterkte van de gebruikersnaam en het wachtwoord. Bezoekers kunnen
                            deze eisen bekijken door over het <i class="icon-question-sign"></i> icoontje te hoveren met hun muis. Ze zullen dan de volgende teksten te
                            zien krijgen:
                            <div style="margin: 5px 0;"></div>
                            <blockquote>Bij de username: &#39;Uw gebruikersnaam moet 6-24 karakters lang zijn en mag hoofdletters, kleine letters, getallen en de volgende leestekens bevatten: .,-_.&#39;</blockquote>
                            <blockquote>Bij het wachtwoord: &#39;Uw wachtwoord moet 8-24 karakters lang zijn en tenminste 1 gewone letter, 1 hoofdletter, 1 cijfer en 1 leesteken uit deze reeks: .*[@#$%^&amp;+=_-] bevatten.&#39;</blockquote>
                            Deze input wordt gevalideerd via een <em>ASP.Net RegularExpressionValidator control</em>. Ook mag de input niet leeg zijn. Dit wordt gecheckt via een <em>ASP.Net RequiredFieldValidator</em>.<br />
                            <br />
                            Tegenwoordig is een veel gebruikte aanval op inlogformulieren een <em>brute-force attack</em>. Bij zo'n aanval worden alle mogelijkheden
                            van wachtwoorden geprobeerd op elke mogelijke username. Ook door middel van het timen van de duur van een gemiddelde login attempt kan
                            een aanvaller achterhalen of de gebruikersnaam juist of onjuist is. De oplossing hiervoor wordt toegelicht in paragraaf <a href="#2-3">2.3 Wachtwoordsterkte / brute-force</a>.<br />
                            <br />
                            Een andere manier van aanvallen is <em>SQL injection</em>. Aangenomen wordt dat SQL injection een bekend gegeven is. Om deze aanvalsvorm tegen te gaan, maakt deze applicatie
                            gebruik van Linq2Sql. De database afhandeling wordt zo geregeld via een framework dat zich door de jaren heen bewezen heeft; de tabellen zijn niet direct zichtbaar voor de applicatie.
                        </div>

                        <h4 id="2-2"><span class="label label-success">2.2</span> <strong><em>Toegangscontrole</em></strong></h4>
                        <div style="padding: 3px 30px 20px 30px;">
                            Normale (en aanvallende) bezoekers op de webportal zullen zich moeten registreren voordat ze een vlucht kunnen boeken. Elke gebruiker
                            dient een wachtwoord op te geven waar hij/zij mee in kan loggen op zijn/haar account. Het inloggen wordt tevens besproken in paragraaf
                            <a href="#1-1-2">1.1.2 Inloggen</a>.<br />
                            <br />
                            De toegangscontrole op en rond de database zal in paragraaf <a href="#2-5">2.5 Applicatiedata opslag</a> besproken worden.
                        </div>

                        <h4 id="2-3"><span class="label label-success">2.3</span> <strong><em>Wachtwoordsterkte / brute-force</em></strong></h4>
                        <div style="padding: 3px 30px 20px 30px;">
                            In paragraaf <a href="#2-1">2.1 Inputvalidatie</a> is de wachtwoordsterkte reeds besproken. Het wachtwoord diende te voldoen aan
                            een aantal mininum eisen:
                            <ul>
                                <li>8-24 karakters lang;</li>
                                <li>1 hoofdletter;</li>
                                <li>1 gewone letter;</li>
                                <li>1 cijfer;</li>
                                <li>1 leesteken uit deze reeks: .*[@#$%^&amp;+=_-]</li>
                            </ul>
                            <br />
                            Om <em>timing-</em> en <em>brute-force attacks</em> tegen te gaan, mag een gebruiker maximaal vijf maal verkeerd inloggen
                            voordat zijn account voor vijf minuten geblokkeerd wordt. Als tijdens deze vijf minuten <em>time-out</em> de gebruiker nogmaals
                            probeerd in te loggen, zal de <em>time-out</em> opnieuw gerefreshed worden. Na deze vijf minuten, kan de gebruiker opnieuw vijf maal
                            opnieuw foutief inloggen, voordat hij weer vijf minuten geblokkeerd wordt.
                        </div>

                        <h4 id="2-4"><span class="label label-success">2.4</span> <strong><em>Foutafhandeling en -logging</em></strong></h4>
                        <div style="padding: 3px 30px 20px 30px;">
                            Fouten die gemaakt worden bij user input, zullen netjes via een rode tekst op de pagina terug te zien zijn. Bijvoorbeeld tijdens het
                            registreren, als een username korter is dan 6 karakters (zie paragraaf <a href="#2-1">2.1 Inputvalidatie</a>), zal er naast het username
                            veld de tekst &#39;<span style="color: red">Username ongeldig</span>&#39; weergegeven worden.<br />
                            <br />
                            De bovenstaande user input foutmelding wordt niet op applicatie niveau gelogd. Programma fouten (Exceptions of verkeerde redirects) worden
                            wel gelogd. Ook verkeerde inlog pogingen worden gelogd. Naast de omschrijving van de desbetreffende <em>log entry</em>, worden ook het IP-adres
                            en de datum geregistreerd.<br />
                            <br />
                            Hoe deze log gegevens bekeken kunnen worden, wordt toegelicht in paragraaf <a href="#2-6">2.6 Audit trail en logging</a>.
                        </div>

                        <h4 id="2-5"><span class="label label-success">2.5</span> <strong><em>Applicatiedata opslag</em></strong></h4>
                        <div style="padding: 3px 30px 20px 30px;">
                            De database staat op een aparte server. Deze server draait de <em>Microsoft SQL Server 2008 R2</em> met de nieuwste updates van Microsoft.
                            De database kent een tweetal gebruikers:
                            <ol>
                                <li>PresentatieUser</li>
                                <li>PresentatieAdmin</li>
                            </ol>
                            <br />
                            De logingegevens van de <em>INHollandair Log Application</em> worden in een aparte tabel in de database opgeslagen. De user PresentatieUser kan deze
                            tabel uitlezen en deze wordt dan ook gebruikt voor de Log Application. Zie paragraaf <a href="#2-6">2.6 Audit trail en logging</a> voor
                            meer informatie over de <em>INHollandair Log Application</em>.
                        </div>

                        <h4 id="2-6"><span class="label label-success">2.6</span> <strong><em>Audit trail en logging</em></strong></h4>
                        <div style="padding: 3px 30px 20px 30px;">
                            Om de veiligheid van de applicatie te controleren, zullen de beheerders van de website regelmatig de log gegevens moeten nakijken.
                            Om deze taak te vergemakkelijken en deels te beveiligen, is er besloten de log gegevens niet extern (via de webportal) toegankelijk te maken.
                            De beheerders hebben daarom de toegang tot een aparte Windows applicatie: de <em>INHollandair Log Application</em>. De applicatie is te bekijken in
                            de solution (zie BlackBoard (projectgroep 4) en de e-mail waarbij de code van de webportal is ingeleverd).<br />
                            <br />
                            <div class="alert alert-info">Om in te loggen, gebruik de username-wachtwoord combinatie:<br />
                            Username: Admin<br />
                            Wachtwoord: Admin</div>
                        </div>

                        <h3 id="3"><span class="label label-info">3.</span> <strong>Extra security maatregelen</strong></h3>
                        <div style="padding: 3px 30px 20px 30px;">
                            Behalve de hierboven opgesomde security maatregelen, hebben we zelf ook nog een aantal stappen ondernomen om de webportal veiliger te maken. De
                            belangrijkste hiervan worden in dit hoofdstuk besproken.
                        </div>

                        <h4 id="3-1"><span class="label label-success">3.1</span> <strong><em>SSL/HTTPS verbinding voor elke pagina</em></strong></h4>
                        <div style="padding: 3px 30px 20px 30px;">
                            De gehele website maakt gebruik van SSL/HTTPS. Tijdens het bouwen van de portal was het aanvankelijk de bedoeling dat 
                            alleen het gedeelte waarvoor ingelogd moest worden daadwerkelijk beveiligd zou gaan worden met SSL/HTTPS. Uiteindelijk 
                            is besloten om de gehele website SSL/HTTPS te laten gebruiken.<br />
                            <br />
                            De belangrijkste reden is dat dit het gebruik van de website veiliger maakt voor haar gebruikers. Een andere reden is 
                            dat hierdoor ook elke request hetzelfde behandeld kan worden. Dit houdt in dat er door de website niet per pagina een
                            check uitgevoerd hoeft te worden of de pagina SSL/HTTPS nodig heeft, dit wordt in feite overgenomen door IIS.<br />
                            <br />
                            Gebruikers die een pagina benaderen via het standaard HTTP protocol stuiten op de achtergrond op een errorpagina die het
                            opgevraagde adres omzet naar een HTTPS adres en de gebruiker daarheen stuurt. In de praktijk merkt een gebruiker hier
                            niets van.
                        </div>

                        <h4 id="3-2"><span class="label label-success">3.2</span> <strong><em>ASP ViewState encryptie</em></strong></h4>
                        <div style="padding: 3px 30px 20px 30px;">
                            Sinds ASP.Net 2.0 is de ViewState van ASP.Net ondertekend. Dit houdt in dat het moeilijk is om in de ViewState dingen aan te passen
                            en deze aan een website door te geven. De website weigert bij detectie van handmatige aanpassingen om de aanvraag af te handelen. 
                            Dit voorkomt echter niet dat er aan de kant van de gebruiker gekeken wordt in de ViewState. <br />
                            <br />
                            Om te zorgen dat het aan de kant van de gebruiker ook moeilijk gemaakt wordt, wordt er gebruik gemaakt van ViewState encryptie.
                            Viewstate encryptie is mogelijk met een aantal algoritmes, zoals DES en SHA. Deze website maakt gebruik van SHA1, op alle pagina's.<br />
                            <br />
                            Bron: <a href="http://msdn.microsoft.com/en-us/library/ff649308.aspx">http://msdn.microsoft.com/en-us/library/ff649308.aspx</a>
                        </div>

                    </div>
                </div>
            </div>
        </div>
    </div>
</asp:Content>
